home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
utmisc1
/
ovr50711.lha
/
Over5
/
doc
/
Over5protocol.doc
< prev
Wrap
Text File
|
1996-05-12
|
31KB
|
1,076 lines
Over5protocol.doc
-----------------
Copyright (c) 1995,1996 Daniel Kahlin <tlr@stacken.kth.se>
(last changed 960402)
A bit incomplete, but should work for now.
---------------------------------------------------------------------------
Over5 low level protocol specification
general overview by Daniel Kahlin <tlr@stacken.kth.se>
The low level end of the protocol is able to send and receive data blocks
1 to 256 bytes in size. The protocol ensures that the data is correctly
transferred.
T || name: BASIC BLOCK TRANSFER
I || type: low level specification
M || structures: <TRBLK>, <ACKBLK>
E \/
Sender Receiver
------ --------
1a SEND <TRBLK>_
\__________________________________
\_
1b RECEIVE <TRBLK>
2a _RESPOND <ACKBLK>
________________________________/
_/
2b CHECK <ACKBLK>
T || name: BLOCK TRANSFER WITH RESEND
I || type: low level specification
M || structures: <TRBLK>, <ACKBLK>
E \/
Sender Receiver
------ --------
1a SEND <TRBLK>_
\__________X___X___________________
\_
1b RECEIVE <TRBLK>
2a _RESPOND <ACKBLK>
________________________________/
_/
2b CHECK <ACKBLK>
3a SEND <TRBLK>_
\__________________________________
\_
3b RECEIVE <TRBLK>
4a _RESPOND <ACKBLK>
________________________________/
_/
4b CHECK <ACKBLK>
#define HEAD 0x7e
#define CHANNEL_DATA 1
#define CHANNEL_COMMAND 15
#define ST_OK 0x10
#define ST_RESEND 0x20
<TRBLK>
0x00 UBYTE trblk_head; (=HEAD)
0x01 UBYTE trblk_channel; xy y=channel x=status (status must be 0
when doing blocksend)
0x02 UBYTE trblk_blocknum; blocknumber (0-15)
0x03 UBYTE trblk_size; size of the data block (0x00 => 256 bytes)
0x04 UBYTE trblk_headsum; xor of all the bytes up to trblk_headsum and
including trblk_head must be 0
0x05 UBYTE trblk_body[trblk_size]; the data
0x05+trblk_size
UBYTE trblk_bodysum; xor of the body and trblk_bodysum must be 0
<ACKBLK>
0x00 UBYTE ackblk_head; (=HEAD)
0x01 UBYTE ackblk_channel; xy y=channel x=status
(ST_OK or ST_RESEND)
0x02 UBYTE ackblk_blocknum; blocknumber (0-15)
0x03 UBYTE ackblk_size; size of the data block (0x00 => 256 bytes)
0x04 UBYTE ackblk_headsum; xor of all the bytes up to ackblk_headsum and
including ackblk_head must be 0
/END
---------------------------------------------------------------------------
Over5 high level protocol specification
general overview by Daniel Kahlin <tlr@stacken.kth.se>
Contents:
TYPE_MEMTRANSFER:
WRITEMEM
READMEM
SYS
RUN
TYPE_DISKCOMMAND:
DIRECTORY
STATUS
COMMAND
TYPE_FILETRANSFER:
WRITEFILE
READFILE
TYPE_RAWDISKTRANSFER:
WRITETRACK
READTRACK
WRITESECTOR
READSECTOR
TYPE_SERVER:
SERVERLOAD
SERVERSAVE
SERVERCOMMAND
SERVERREADSTRING
*** WRITEMEM *** WRITEMEM *** WRITEMEM *** WRITEMEM *** WRITEMEM *** WRITEM
T || name: WRITEMEM (part of TYPE_MEMTRANSFER)
I || type: high level specification
M || structures: <WMHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <WMHD>_
\___________________________________
\_
1b RECEIVE <WMHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a SEND BODY_
\_____________________________________
\_
3b RECEIVE BODY
4a _RESPOND <RS>
________________________________/
_/
4b CHECK RESPONSE
*** READMEM *** READMEM *** READMEM *** READMEM *** READMEM *** READMEM ***
T || name: READMEM (part of TYPE_MEMTRANSFER)
I || type: high level specification
M || structures: <RMHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <RMHD>_
\___________________________________
\_
1b RECEIVE <RMHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _SEND BODY
__________________________________/
_/
3b RECEIVE BODY
4a RESPOND <RS>_
\__________________________________
\_
4b CHECK RESPONSE
*** SYS *** SYS *** SYS *** SYS *** SYS *** SYS *** SYS *** SYS *** SYS ***
T || name: SYS (part of TYPE_MEMTRANSFER)
I || type: high level specification
M || structures: <SYHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <SYHD>_
\___________________________________
\_
1b RECEIVE <SYHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
*** RUN *** RUN *** RUN *** RUN *** RUN *** RUN *** RUN *** RUN *** RUN ***
T || name: RUN (part of TYPE_MEMTRANSFER)
I || type: high level specification
M || structures: <RUHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <RUHD>_
\___________________________________
\_
1b RECEIVE <RUHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
*** DIRECTORY *** DIRECTORY *** DIRECTORY *** DIRECTORY *** DIRECTORY *** D
T || name: DIRECTORY (part of TYPE_DISKCOMMAND)
I || type: high level specification
M || structures: <DRHD>, <DRRS>, <RS>
E \/
Amiga c64
----- ---
1a SEND <DRHD>_
\___________________________________
\_
1b RECEIVE <DRHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _RESPOND <DRRS>
________________________________/
_/
3b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
4a RESPOND <RS>_
\__________________________________
\_
4b CHECK RESPONSE
5a _SEND BODY
__________________________________/
_/
5b RECEIVE BODY
6a RESPOND <RS>_
\__________________________________
\_
6b CHECK RESPONSE
*** STATUS *** STATUS *** STATUS *** STATUS *** STATUS *** STATUS *** STATU
T || name: STATUS (part of TYPE_DISKCOMMAND)
I || type: high level specification
M || structures: <STHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <STHD>_
\___________________________________
\_
1b RECEIVE <STHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _SEND BLOCK
_________________________________/
_/
3b RECEIVE BLOCK
4a RESPOND <RS>_
\__________________________________
\_
4b CHECK RESPONSE
*** COMMAND *** COMMAND *** COMMAND *** COMMAND *** COMMAND *** COMMAND ***
T || name: COMMAND (part of TYPE_DISKCOMMAND)
I || type: high level specification
M || structures: <CMHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <CMHD>_
\___________________________________
\_
1b RECEIVE <CMHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a SEND BLOCK_
\___________________________________
\_
3b RECEIVE BLOCK
4a _RESPOND <RS>
________________________________/
_/
4b CHECK RESPONSE
*** WRITEFILE *** WRITEFILE *** WRITEFILE *** WRITEFILE *** WRITEFILE *** W
T || name: WRITEFILE (part of TYPE_FILETRANSFER)
I || type: high level specification
M || structures: <WFHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <WFHD>_
\___________________________________
\_
1b RECEIVE <WFHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a SEND BODY_
\_____________________________________
\_
3b RECEIVE BODY
4a _RESPOND <RS>
________________________________/
_/
4b CHECK RESPONSE
*** READFILE *** READFILE *** READFILE *** READFILE *** READFILE *** READFI
T || name: READFILE (part of TYPE_DISKCOMMAND)
I || type: high level specification
M || structures: <RFHD>, <RFRS>, <RS>
E \/
Amiga c64
----- ---
1a SEND <RFHD>_
\___________________________________
\_
1b RECEIVE <RFHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _RESPOND <RFRS>
________________________________/
_/
3b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
4a RESPOND <RS>_
\__________________________________
\_
4b CHECK RESPONSE
5a _SEND BODY
__________________________________/
_/
5b RECEIVE BODY
6a RESPOND <RS>_
\__________________________________
\_
6b CHECK RESPONSE
*** WRITETRACK *** WRITETRACK *** WRITETRACK *** WRITETRACK *** WRITETRACK
T || name: WRITETRACK (part of TYPE_RAWDISKTRANSFER)
I || type: high level specification
M || structures: <WTHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <WTHD>_
\___________________________________
\_
1b RECEIVE <WTHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a SEND BODY_
\_____________________________________
\_
3b RECEIVE BODY
4a _RESPOND <RS>
________________________________/
_/
4b CHECK RESPONSE
*** READTRACK *** READTRACK *** READTRACK *** READTRACK *** READTRACK *** R
T || name: READTRACK (part of TYPE_RAWDISKTRANSFER)
I || type: high level specification
M || structures: <RTHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <RTHD>_
\___________________________________
\_
1b RECEIVE <RTHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _RESPOND <RS>
________________________________/
_/
3b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
4a RESPOND <RS>_
\__________________________________
\_
4b CHECK RESPONSE
5a _SEND BODY
__________________________________/
_/
5b RECEIVE BODY
6a RESPOND <RS>_
\__________________________________
\_
6b CHECK RESPONSE
*** WRITESECTOR *** WRITESECTOR *** WRITESECTOR *** WRITESECTOR *** WRITESE
T || name: WRITESECTOR (part of TYPE_RAWDISKTRANSFER)
I || type: high level specification
M || structures: <WSHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <WSHD>_
\___________________________________
\_
1b RECEIVE <WSHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a SEND BODY_
\_____________________________________
\_
3b RECEIVE BODY
4a _RESPOND <RS>
________________________________/
_/
4b CHECK RESPONSE
*** READSECTOR *** READSECTOR *** READSECTOR *** READSECTOR *** READSECTOR
T || name: READSECTOR (part of TYPE_RAWDISKTRANSFER)
I || type: high level specification
M || structures: <RSHD>, <RS>
E \/
Amiga c64
----- ---
1a SEND <RSHD>_
\___________________________________
\_
1b RECEIVE <RSHD>
2a _RESPOND <RS>
________________________________/
_/
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _RESPOND <RS>
________________________________/
_/
3b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
4a _SEND BODY
__________________________________/
_/
4b RECEIVE BODY
5a RESPOND <RS>_
\__________________________________
\_
5b CHECK RESPONSE
*** SERVERLOAD *** SERVERLOAD *** SERVERLOAD *** SERVERLOAD *** SERVERLOAD
T || name: SERVERLOAD (part of TYPE_SERVER)
I || type: high level specification
M || structures: <SRVLDHD>, <SRVLDRS>, <SRVLDRS2>, <RS>
E \/
Amiga c64
----- ---
1a _SEND <SRVLDHD>
_____________________________/
_/
1b RECEIVE <SRVLDHD>
2a RESPOND <SRVLDRS>_
\_____________________________
\_
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _RESPOND <SRVLDRS2>
________________________________/
_/
3b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
4a SEND BODY_
\_____________________________________
\_
4b RECEIVE BODY
5a _RESPOND <RS>
________________________________/
_/
5b CHECK RESPONSE
*** SERVERSAVE *** SERVERSAVE *** SERVERSAVE *** SERVERSAVE *** SERVERSAVE
T || name: SERVERSAVE (part of TYPE_SERVER)
I || type: high level specification
M || structures: <SRVSVHD>, <RS>
E \/
Amiga c64
----- ---
1a _SEND <SRVSVHD>
_____________________________/
_/
1b RECEIVE <SRVSVHD>
2a RESPOND <RS>_
\__________________________________
\_
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _SEND BODY
__________________________________/
_/
3b RECEIVE BODY
4a RESPOND <RS>_
\__________________________________
\_
4b CHECK RESPONSE
*** SERVERCOMMAND *** SERVERCOMMAND *** SERVERCOMMAND *** SERVERCOMMAND ***
T || name: SERVERCOMMAND (part of TYPE_SERVER)
I || type: high level specification
M || structures: <SRVCMHD>, <RS>
E \/
Amiga c64
----- ---
1a _SEND <SRVCMHD>
_____________________________/
_/
1b RECEIVE <SRVCMHD>
2a RESPOND <RS>_
\__________________________________
\_
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a RESPOND <RS>_
\__________________________________
\_
3b CHECK RESPONSE
*** SERVERREADSTRING *** SERVERREADSTRING *** SERVERREADSTRING *** SERVERRE
T || name: SERVERREADSTRING (part of TYPE_SERVER)
I || type: high level specification
M || structures: <SRVRSHD>, <SRVRSRS>, <RS>
E \/
Amiga c64
----- ---
1a _SEND <SRVRSHD>
_____________________________/
_/
1b RECEIVE <SRVRSHD>
2a RESPOND <SRVRSRS>_
\_____________________________
\_
2b CHECK RESPONSE
-- if (RESP!=OK) -> FAIL
3a _RESPOND <RS>
________________________________/
_/
3b CHECK RESPONSE
4a SEND BODY_
\_____________________________________
\_
4b RECEIVE BODY
/END
---------------------------------------------------------------------------
Over5 high level protocol specification
structures in detail by Daniel Kahlin <tlr@stacken.kth.se>
All information sent on CHANNEL_COMMAND should begin with the structures
<OHD> and <RS>. This allows us to easily detect protocol errors.
<OHD> general request
0x00 UBYTE ohd_type;
0x01 UBYTE ohd_subtype;
<RS> general response
0x00 UBYTE rs_response;
The distinction between an <OHD> and an <RS> can be made using the first
byte. If MSB is 1, it is an <RS> else it is an <OHD>.
The list below contains all types and responses.
#define TYPE_MEMTRANSFER 0x01
#define TYPE_FILETRANSFER 0x02
#define TYPE_DISKCOMMAND 0x03
#define TYPE_TESTCOMMAND 0x04
#define TYPE_SERVER 0x05
#define TYPE_RAWDISKTRANSFER 0x06
#define RESP_OK 0x80
#define RESP_NOTSUPPORTED 0x81
#define RESP_ERROR 0x82
#define RESP_STRING 0x83
The 'type' field can be used to easily determine if a certain chunk of
commands are supported. When the 'type' field has been evaluated you
should jump to appropriate routine which in its turn evaluates the
'subtype' field. These subtypes apply:
#define SUB_MT_WRITEMEM 0x01 ;TYPE_MEMTRANSFER
#define SUB_MT_READMEM 0x02
#define SUB_MT_SYS 0x03
#define SUB_MT_RUN 0x04
#define SUB_FT_WRITEFILE 0x01 ;TYPE_FILETRANSFER
#define SUB_FT_READFILE 0x02
#define SUB_DC_DIRECTORY 0x01 ;TYPE_DISKCOMMAND
#define SUB_DC_STATUS 0x02
#define SUB_DC_COMMAND 0x03
#define SUB_TC_BLOCKTEST 0x01 ;TYPE_TESTCOMMAND
#define SUB_TC_FILETEST 0x02
#define SUB_SRV_LOAD 0x01 ;TYPE_SERVER
#define SUB_SRV_SAVE 0x02
#define SUB_SRV_COMMAND 0x03
#define SUB_SRV_READSTRING 0x04
#define SUB_RT_WRITETRACK 0x01 ;TYPE_RAWDISKTRANSFER
#define SUB_RT_READTRACK 0x02
#define SUB_RT_WRITESECTOR 0x03
#define SUB_RT_READSECTOR 0x04
Here follows a detailed specification of all structures currently
used by the high level protocol.
<WMHD>
0x00 UBYTE wmhd_type; (=TYPE_MEMTRANSFER)
0x01 UBYTE wmhd_subtype; (=SUB_MT_WRITEMEM)
0x02 UBYTE wmhd_start_l; \ start address in c64 memory
0x03 UBYTE wmhd_start_h; /
0x04 UBYTE wmhd_end_l; \ end address in c64 memory
0x05 UBYTE wmhd_end_h; /
<RMHD>
0x00 UBYTE rmhd_type; (=TYPE_MEMTRANSFER)
0x01 UBYTE rmhd_subtype; (=SUB_MT_READMEM)
0x02 UBYTE rmhd_start_l; \ start address in c64 memory
0x03 UBYTE rmhd_start_h; /
0x04 UBYTE rmhd_end_l; \ end address in c64 memory
0x05 UBYTE rmhd_end_h; /
<SYHD>
0x00 UBYTE syhd_type; (=TYPE_MEMTRANSFER)
0x01 UBYTE syhd_subtype; (=SUB_MT_SYS)
0x02 UBYTE syhd_pc_l; \ 6502 program counter
0x03 UBYTE syhd_pc_h; /
0x04 UBYTE syhd_memory; $01 value for the c64
0x05 UBYTE syhd_sr; 6502 status register
0x06 UBYTE syhd_ac; 6502 accumulator
0x07 UBYTE syhd_xr; 6502 X register
0x08 UBYTE syhd_yr; 6502 Y register
0x09 UBYTE syhd_sp; 6502 stack pointer
<RUHD>
0x00 UBYTE ruhd_type; (=TYPE_MEMTRANSFER)
0x01 UBYTE ruhd_subtype; (=SUB_MT_RUN)
0x02 UBYTE ruhd_lowmem_l; \ start of basic program
0x03 UBYTE ruhd_lowmem_h; /
0x04 UBYTE ruhd_himem_l; \ end of basic program
0x05 UBYTE ruhd_himem_h; /
<DRHD>
0x00 UBYTE drhd_type; (=TYPE_DISKCOMMAND)
0x01 UBYTE drhd_subtype; (=SUB_DC_DIRECTORY)
0x02 UBYTE drhd_pad[2];
0x04 UBYTE drhd_device; device number
0x05 UBYTE drhd_filename[24]; filename
<DRRS>
0x00 UBYTE drrs_response; response code
0x01 UBYTE drrs_len_l; \ length of directory in bytes
0x02 UBYTE drrs_len_h; /
<STHD>
0x00 UBYTE sthd_type; (=TYPE_DISKCOMMAND)
0x01 UBYTE sthd_subtype; (=SUB_DC_STATUS)
0x02 UBYTE sthd_pad[2];
0x04 UBYTE sthd_device; device number
<CMHD>
0x00 UBYTE cmhd_type; (=TYPE_DISKCOMMAND)
0x01 UBYTE cmhd_subtype; (=SUB_DC_COMMAND)
0x02 UBYTE cmhd_pad[2];
0x04 UBYTE cmhd_device; device number
<WFHD>
0x00 UBYTE wfhd_type; (=TYPE_FILETRANSFER)
0x01 UBYTE wfhd_subtype; (=SUB_FT_WRITEFILE)
0x02 UBYTE wfhd_len_l; \ length of file
0x03 UBYTE wfhd_len_h; /
0x04 UBYTE wfhd_device; device number
0x05 UBYTE wfhd_filename[24]; filename
<RFHD>
0x00 UBYTE rfhd_type; (=TYPE_FILETRANSFER)
0x01 UBYTE rfhd_subtype; (=SUB_FT_READFILE)
0x02 UBYTE rfhd_pad[2];
0x04 UBYTE rfhd_device; device number
0x05 UBYTE rfhd_filename[24]; filename
<RFRS>
0x00 UBYTE rfrs_response; response code
0x01 UBYTE rfrs_len_l; \ length of file in bytes
0x02 UBYTE rfrs_len_h; /
<WTHD>
0x00 UBYTE wthd_type; (=TYPE_RAWDISKTRANSFER)
0x01 UBYTE wthd_subtype; (=SUB_RT_WRITETRACK)
0x02 UBYTE wthd_track; track to write
0x03 UBYTE wthd_numtracks; number of tracks to be written
0x04 UBYTE wthd_device; device number
<RTHD>
0x00 UBYTE wthd_type; (=TYPE_RAWDISKTRANSFER)
0x01 UBYTE wthd_subtype; (=SUB_RT_READTRACK)
0x02 UBYTE wthd_track; track to read
0x03 UBYTE wthd_numtracks; number of tracks to be read
0x04 UBYTE wthd_device; device number
<RTRS>
0x00 UBYTE rtrs_response; response code
0x01 UBYTE rtrs_sectors; number of sectors
<WSHD>
0x00 UBYTE wshd_type; (=TYPE_RAWDISKTRANSFER)
0x01 UBYTE wshd_subtype; (=SUB_RT_WRITESECTOR)
0x02 UBYTE wshd_track; track to write
0x03 UBYTE wshd_sector; sector to write
0x04 UBYTE wshd_device; device number
<RSHD>
0x00 UBYTE rshd_type; (=TYPE_RAWDISKTRANSFER)
0x01 UBYTE rshd_subtype; (=SUB_RT_READSECTOR)
0x02 UBYTE rshd_track; track to read
0x03 UBYTE rshd_sector; sector to read
0x04 UBYTE rshd_device; device number
<BTHD>
0x00 UBYTE bthd_type; (=TYPE_TESTCOMMAND)
0x01 UBYTE bthd_subtype; (=SUB_TC_BLOCKTEST)
<FTHD>
0x00 UBYTE fthd_type; (=TYPE_TESTCOMMAND)
0x01 UBYTE fthd_subtype; (=SUB_TC_FILETEST)
0x02 UBYTE fthd_len_l; \ length of test data in bytes
0x03 UBYTE fthd_len_h; /
<FTRS>
0x00 UBYTE ftrs_response; response code
0x01 UBYTE ftrs_len_l; \ length of file in bytes
0x02 UBYTE ftrs_len_h; /
<SRVLDHD>
0x00 UBYTE srvldhd_type; (=TYPE_SERVER)
0x01 UBYTE srvldhd_subtype; (=SUB_SRV_LOAD)
0x02 UBYTE srvldhd_pad[4];
0x06 UBYTE srvldhd_filename[64]; filename to load
<SRVLDRS>
0x00 UBYTE srvldrs_response; response code
0x01 UBYTE srvldrs_start_l; \ start address of file
0x02 UBYTE srvldrs_start_h; /
0x03 UBYTE srvldrs_end_h; \ end address of file
0x04 UBYTE srvldrs_end_h; /
<SRVLDRS2>
0x00 UBYTE srvldrs2_response; response code
0x01 UBYTE srvldrs2_start_l; \ new start address
0x02 UBYTE srvldrs2_start_h; /
<SRVSVHD>
0x00 UBYTE srvsvhd_type; (=TYPE_SERVER)
0x01 UBYTE srvsvhd_subtype; (=SUB_SRV_SAVE)
0x02 UBYTE srvsvhd_start_l; \ start address of file
0x03 UBYTE srvsvhd_start_h; /
0x04 UBYTE srvsvhd_end_h; \ end address of file
0x05 UBYTE srvsvhd_end_h; /
0x06 UBYTE srvsvhd_filename[64]; filename to load
<SRVCMHD>
0x00 UBYTE srvcmhd_type; (=TYPE_SERVER)
0x01 UBYTE srvcmhd_subtype; (=SUB_SRV_COMMAND)
0x02 UBYTE srvcmhd_pad[4];
0x06 UBYTE srvcmhd_command[64]; the command
<SRVRSHD>
0x00 UBYTE srvrshd_type; (=TYPE_SERVER)
0x01 UBYTE srvrshd_subtype; (=SUB_SRV_READSTRING)
0x02 UBYTE srvrshd_width; width of destination screen
0x03 UBYTE srvrshd_height; height of destination screen
<SRVRSRS>
0x00 UBYTE srvrsrs_response; response code
0x01 UBYTE srvrsrs_rows; number of actual rows
/END